package com.ctshk.rpc.bus.service;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.bus.dto.BusB2CRecommendedDTO;
import com.ctshk.rpc.bus.dto.BusPriceRemainderDTO;
import com.ctshk.rpc.bus.dto.BusProductDTO;
import com.ctshk.rpc.bus.dto.BusProductPageDTO;
import com.ctshk.rpc.bus.dto.BusProductReservationAgentDTO;
import com.ctshk.rpc.bus.dto.BusReservationAgentDTO;
import com.ctshk.rpc.bus.dto.BusSeatDTO;
import com.ctshk.rpc.bus.dto.RecommendedBusDTO;
import com.ctshk.rpc.bus.dto.ReservationBusPageDTO;
import com.ctshk.rpc.bus.dto.es.BusProductCacheDTO;
import com.ctshk.rpc.bus.req.BatchBusProductInfoReq;
import com.ctshk.rpc.bus.req.BusB2CRecommendedListQueryReq;
import com.ctshk.rpc.bus.req.BusIncreaseStrategyPriceQueryReq;
import com.ctshk.rpc.bus.req.BusProductAddApprovalReq;
import com.ctshk.rpc.bus.req.BusProductListForIotcQueryReq;
import com.ctshk.rpc.bus.req.BusProductQueryReq;
import com.ctshk.rpc.bus.req.BusProductReq;
import com.ctshk.rpc.bus.req.BusProductReservationAgentQueryReq;
import com.ctshk.rpc.bus.req.BusProductReservationSettingsReq;
import com.ctshk.rpc.bus.req.BusProductSetReq;
import com.ctshk.rpc.bus.req.ReservationBusDetailReq;
import com.ctshk.rpc.bus.req.ReservationBusPageReq;

/**
 * <p>
 * 巴士产品表 服务类
 * </p>
 *
 * @author 彭柳霖
 * @since 2021-02-08
 */
public interface IBusProductService {

    /**
     * 分页查询巴士产品列表
     *
     * @param req
     * @return
     */
    Result<PageResponse<BusProductPageDTO>> queryList(BusProductQueryReq req, TokenUser tokenUser);

    /**
     * 新增巴士产品信息
     *
     * @param busProductReq
     * @param user
     */
    Result saveBusProduct(BusProductReq busProductReq, TokenUser user);

    /**
     * 新增巴士产品预订信息
     *
     * @param reservationSettingsReq
     * @param user
     */
    Result saveReservation(BusProductReservationSettingsReq reservationSettingsReq, TokenUser user);

    /**
     * 修改巴士产品预订信息
     *
     * @param reservationSettingsReq
     * @param user
     */
    Result updateReservation(BusProductReservationSettingsReq reservationSettingsReq, TokenUser user);

    /**
     * 新增-编辑提交审批
     *
     * @param id
     * @param user
     */
    Result submit(Long id, TokenUser user);

    /**
     * 修改审核通过巴士产品
     */
    Result updateApprovedBusProduct(BusProductReq busProductReq, TokenUser user);

    /**
     * 修改审核不通过巴士产品
     */
    Result updateUnapprovedBusProduct(BusProductReq busProductReq, TokenUser user);


    /**
     * 查询巴士产品详情信息
     *
     * @param id
     * @return
     */
    BusProductDTO queryDetail(Long id);

    /**
     * 查询巴士线路座位信息
     *
     * @param lineId
     * @return
     */
    BusSeatDTO querySeats(Long lineId);

    /**
     * api设置
     *
     * @param busProductSetReq
     */
    Result setApi(BusProductSetReq busProductSetReq, TokenUser user);

    /**
     * 有效无效设置
     *
     * @param id
     */
    Result setValid(Long id, TokenUser user);

    /**
     * 批量设置
     *
     * @param batchBusProductInfoReq
     */
    Result batchSetting(BatchBusProductInfoReq batchBusProductInfoReq, TokenUser user);

    /**
     * 推荐设置
     *
     * @param id
     */
    Result setRecommended(Long id, TokenUser user);

    /**
     * 查询巴士票推荐列表
     */
    List<RecommendedBusDTO> queryRecommendedBusTicket(Long userId);

    /**
     * 预订中心-分页查询巴士票
     *
     * @param busPageReq
     * @return
     */
    PageResponse<ReservationBusPageDTO> queryReservationBusList(ReservationBusPageReq busPageReq, Long userId);

    /**
     * 巴士票预订详情
     *
     * @return
     */
    Result<ReservationBusPageDTO> queryReservationBusDetail(ReservationBusDetailReq req, TokenUser tokenUser);

    /**
     * 根据巴士产品id，查询预订中心预订时可以用于代理的代理商列表
     *
     * @param id
     * @return
     */
    Result<List<BusReservationAgentDTO>> selectReservationAgentListById(Long id);

    /**
     * 根据机场快线id和用户id，查询用户自营下的加幅后价格和余票信息,售出数量增加
     *
     * @param busIncreaseStrategyPriceQueryReq
     * @return
     */
    BusPriceRemainderDTO selectSelfPriceRemainderAndLock(BusIncreaseStrategyPriceQueryReq busIncreaseStrategyPriceQueryReq, Long userId);

    /**
     * 中汽巴士API产品接入
     */
    Result importRglBusProduct() throws Exception;

    /**
     * 中港通巴士API产品接入
     */
    Result importHktBusProduct() throws Exception;

    /**
     * 中港通巴士API产品数据入库
     *
     * @param mapList
     */
    int batchsaveHktBusProduct(List<Map> mapList) throws Exception;

    /**
     * 巴士新增产品审批
     *
     * @param req
     * @return
     */
    Result<Void> approval(BusProductAddApprovalReq req, TokenUser tokenUser);

    /**
     * C端查询巴士预订推荐列表
     *
     * @return
     */
    Result<List<BusB2CRecommendedDTO>> queryB2CRecommendedList(BusB2CRecommendedListQueryReq req);

    /**
     * C端查询巴士产品列表
     *
     * @return
     */
    List<BusProductCacheDTO> queryBusProductList(List<Long> ids);

    /**
     * 运营中心查询巴士产品列表
     *
     * @param req
     * @return
     */
    Result<PageResponse<BusProductDTO>> queryProductListForIotc(BusProductListForIotcQueryReq req);

    /**
     * 运营中心根据ID查询巴士产品列表
     *
     * @param idList
     * @return
     */
    Result<List<BusProductDTO>> queryProductListByIdForIotc(List<Long> idList);
    
    /**
     * 查询预订用的代理商信息列表
     * @param req
     * @return
     */
    Result<List<BusProductReservationAgentDTO>> queryReservationAgentList(BusProductReservationAgentQueryReq req, TokenUser tokenUser);
    
    /**
     * 保存巴士产品已售信息
     * @param saleableNumber         库存数，-1则不限制
     * @param touristNumber
     * @param busProduct
     * @param departureDate
     */
    void saveProductSold(BusPriceRemainderDTO dto, int touristNumber, Long userId);
    
    /**
     * 查询巴士产品售价信息逻辑处理
     * @param strategyType 加幅类型，1：自营；2：代理；3：官方平台；4：第三方平台；
     * @param productId 产品ID
     * @param departureDate 出发日期
     * @param relId 关联ID，strategyType(1：用户ID；2：代理ID；3：渠道ID；4：渠道ID)
     * @return
     */
    BusPriceRemainderDTO findBusSalePriceInfoHandle(int strategyType, Long productId, LocalDate departureDate, Long relId);
    
    /**
     * 查询巴士产品售价信息 - 线下自营
     * @return
     */
    default BusPriceRemainderDTO findBusSalePriceInfoOfflineSelf(Long productId, LocalDate departureDate, Long userId) {
    	return findBusSalePriceInfoHandle(1, productId, departureDate, userId);
    }
    
    /**
     * 查询巴士产品售价信息 - 线下代理
     * @return
     */
    default BusPriceRemainderDTO findBusSalePriceInfoOfflineAgent(Long productId, LocalDate departureDate, Long agentId) {
    	return findBusSalePriceInfoHandle(2, productId, departureDate, agentId);
    }
    
    /**
     * 查询巴士产品售价信息 - 官方平台
     * @return
     */
    default BusPriceRemainderDTO findBusSalePriceInfoOnlineSelf(Long productId, LocalDate departureDate, Long channelId) {
    	return findBusSalePriceInfoHandle(3, productId, departureDate, channelId);
    }
    
    /**
     * 回滚已售数量
     */
    void rollbackSold(Long productId, int num, LocalDate departureDate, Long userId);
}
